home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / pckey.exe / PCKEY.HPP < prev    next >
C/C++ Source or Header  |  1991-08-23  |  8KB  |  338 lines

  1. /*
  2.  
  3.     pckey.hpp
  4.     8-23-91
  5.     PC keyboard class for Borland C++
  6.  
  7.     Copyright 1991
  8.     John W. Small
  9.     All rights reserved
  10.     Use freely but acknowledge authorship and copyright.
  11.  
  12.     PSW / Power SoftWare
  13.     P.O. Box 10072
  14.     McLean, Virginia 22102 8072 USA
  15.  
  16.     John Small
  17.     Voice: (703) 759-3838
  18.     CIS: 73757,2233
  19.  
  20. */
  21.  
  22. #ifndef PCKEY_HPP
  23. #define PCKEY_HPP
  24.  
  25. #include <dos.h>
  26.  
  27.  
  28. //  Typematic Rate = 10 x characters per second
  29. //  characters per second = TypeMaticRate / 10
  30.  
  31. enum TypeMaticRate  { TMR300, TMR267, TMR240, TMR218,
  32.     TMR200, TMR185, TMR171, TMR160, TMR150, TMR133,
  33.     TMR120, TMR109, TMR100, TMR092, TMR086, TMR080,
  34.     TMR075, TMR067, TMR060, TMR055, TMR050, TMR046,
  35.     TMR043, TMR040, TMR037, TMR033, TMR030, TMR027,
  36.     TMR025, TMR023, TMR021, TMR020 };
  37.  
  38.  
  39. //  Typematic Delay in milliseconds
  40.  
  41. enum TypeMaticDelay  { TMD250, TMD500, TMD750, TMD1000 };
  42.  
  43. //  Returned by extended keys on 101/102 keyboards
  44. //  that duplicate keys available on 84 key format.
  45. //  Consider the home key ...
  46. //  On number pad:  PCK.ascii() ==   0  PCK.scan() == 71
  47. //  By itself:      PCK.ascii() == 224  PCK.scan() == 71
  48. #define  ExtendKey   224
  49.  
  50.  
  51. //  Do not instantiate!
  52.  
  53. class PCKey  {
  54. // Variables are static to save having to dereference
  55. // the "this" pointer in the inline member functions.
  56. static    unsigned asciiScan;
  57. static    unsigned char enhancedKeyBrd;
  58. static    unsigned enhancedShiftMask;
  59. static  unsigned fastTypeMaticExit;
  60. public:
  61.     PCKey();
  62.     int enhanced()  { return (int) enhancedKeyBrd; }
  63. // Ascii code of last character read with getch(), getkey(),
  64. // or character waiting with kbhit().
  65.     int ascii()
  66.         { return (int)(asciiScan & 0x00FF); }
  67. // Scan code of last character read with gethch(), getkey(),
  68. // or character waiting with kbhit().
  69.     int scan()
  70.         { return (int)((asciiScan & 0xFF00) >> 8); }
  71. // special characters return zero or ExtendKey, see scan()
  72.     int getch()  {
  73.         unsigned as;
  74.  
  75.         _AH = enhancedKeyBrd;
  76.         geninterrupt(0x16);
  77.         as = _AX;
  78.         asciiScan = as;
  79.         return (int)(as & 0x00FF);
  80.     }
  81. // special characters return the negative of their scan code
  82. // non special characters return their ascii code
  83.     int getkey()  {
  84.         unsigned as;
  85.         int a;
  86.  
  87.         _AH = enhancedKeyBrd;
  88.         geninterrupt(0x16);
  89.         as = _AX;
  90.         asciiScan = as;
  91.         a = (int) (as & 0x00FF);
  92.         return ((a && a != ExtendKey)?
  93.             a : -(int)((as & 0xFF00) >> 8));
  94.     }
  95.     int kbhit()  {
  96.         unsigned as;
  97.  
  98.         _AH = 0x01 | enhancedKeyBrd;
  99.         geninterrupt(0x16);
  100.         as = _AX;
  101.         asciiScan = as;
  102.         return !(int)(_FLAGS & 0x0040);
  103.     }
  104.     unsigned shift()  {
  105.         unsigned s;
  106.  
  107.         _AH = 0x02 | enhancedKeyBrd;
  108.         geninterrupt(0x16);
  109.         s = _AX;
  110.         return (s & enhancedShiftMask);
  111.     }
  112.     unsigned InsertStateActive()
  113.         { return (shift() & 0x0080); }
  114.     unsigned CapsLockActive()
  115.         { return (shift() & 0x0040); }
  116.     unsigned NumLockActive()
  117.         { return (shift() & 0x0020); }
  118.     unsigned ScrollLockActive()
  119.         { return (shift() & 0x0010); }
  120.     unsigned AltPressed()
  121.         { return (shift() & 0x0008); }
  122.     unsigned CtrlPressed()
  123.         { return (shift() & 0x0004); }
  124.     unsigned LeftShiftPressed()
  125.         { return (shift() & 0x0002); }
  126.     unsigned RightShiftPressed()
  127.         { return (shift() & 0x0001); }
  128.     unsigned ShiftPressed()
  129.         { return (shift() & 0x0003); }
  130.     unsigned SysReqPressed()
  131.         { return (shift() & 0x8000); }
  132.     unsigned CapsLockPressed()
  133.         { return (shift() & 0x4000); }
  134.     unsigned NumLockPressed()
  135.         { return (shift() & 0x2000); }
  136.     unsigned ScrollLockPressed()
  137.         { return (shift() & 0x1000); }
  138.     unsigned RightAltPressed()
  139.         { return (shift() & 0x0800); }
  140.     unsigned RightCtrlPressed()
  141.         { return (shift() & 0x0400); }
  142.     unsigned LeftAltPressed()
  143.         { return (shift() & 0x0200); }
  144.     unsigned LeftCtrlPressed()
  145.         { return (shift() & 0x0100); }
  146.     void setTypeMatic(
  147.         enum TypeMaticRate TMrate = TMR109,
  148.         enum TypeMaticDelay TMdelay = TMD500)  {
  149.         _BX = (TMdelay << 8) | TMrate;
  150.         _AX = 0x0305;
  151.         geninterrupt(0x16);
  152.     }
  153.     void fastTypeMatic()  { setTypeMatic(TMR300,TMD250); }
  154.     void fastTypeMaticOnExit()  { fastTypeMaticExit = 1; }
  155.     int putch(unsigned asciiScan)  {
  156.         _CX = asciiScan;
  157.         _AH = 0x05;
  158.         geninterrupt(0x16);
  159.         return !((int) _AL);
  160.     }
  161.     void flush();
  162.     ~PCKey() { if (fastTypeMaticExit) fastTypeMatic();
  163.         else setTypeMatic(); }
  164. };
  165.  
  166. extern PCKey PCK;  // Only instant, do not instantiate!
  167.  
  168.  
  169. //  Note: Ctrl keys are not special!
  170. //  Returned by getch() and ascii().
  171.  
  172. #define  CtrlA     1
  173. #define  CtrlB     2
  174. #define  CtrlC     3
  175. #define  CtrlD     4
  176. #define  CtrlE     5
  177. #define  CtrlF     6
  178. #define  CtrlG     7
  179. #define  CtrlH     8
  180. #define  CtrlI     9
  181. #define  CtrlJ    10
  182. #define  CtrlK    11
  183. #define  CtrlL    12
  184. #define  CtrlM    13
  185. #define  CtrlN    14
  186. #define  CtrlO    15
  187. #define  CtrlP    16
  188. #define  CtrlQ    17
  189. #define  CtrlR    18
  190. #define  CtrlS    19
  191. #define  CtrlT    20
  192. #define  CtrlU    21
  193. #define  CtrlV    22
  194. #define  CtrlW    23
  195. #define  CtrlX    24
  196. #define  CtrlY    25
  197. #define  CtrlZ    26
  198.  
  199.  
  200. //  Special Key Codes returned via scan() when getch() == 0.
  201.  
  202. #define  AltA         30
  203. #define  AltB         48
  204. #define  AltC         46
  205. #define  AltD         32
  206. #define  AltE         18
  207. #define  AltF         33
  208. #define  AltG         34
  209. #define  AltH         35
  210. #define  AltI         23
  211. #define  AltJ         36
  212. #define  AltK         37
  213. #define  AltL         38
  214. #define  AltM         50
  215. #define  AltN         49
  216. #define  AltO         24
  217. #define  AltP         25
  218. #define  AltQ         16
  219. #define  AltR         19
  220. #define  AltS         31
  221. #define  AltT         20
  222. #define  AltU         22
  223. #define  AltV         47
  224. #define  AltW         17
  225. #define  AltX         45
  226. #define  AltY         21
  227. #define  AltZ         44
  228.  
  229. #define  Home         71
  230. #define  UpArr        72
  231. #define  PgUp         73
  232. #define  LArr         75
  233. #define  RArr         77
  234. #define  EndKey       79
  235. #define  DnArr        80
  236. #define  PgDn         81
  237. #define  InsKey       82
  238. #define  DelKey       83
  239.  
  240. #define  CtrlHome    119
  241. #define  CtrlPgUp    132
  242. #define  CtrlLArr    115
  243. #define  CtrlRArr    116
  244. #define  CtrlEnd     117
  245. #define  CtrlPgDn    118
  246.  
  247. #define  Alt1        120
  248. #define  Alt2        121
  249. #define  Alt3        122
  250. #define  Alt4        123
  251. #define  Alt5        124
  252. #define  Alt6        125
  253. #define  Alt7        126
  254. #define  Alt8        127
  255. #define  Alt9        128
  256. #define  Alt0        129
  257.  
  258. #define  AltHyphen   130
  259. #define  AltEquals   131
  260. #define  CtrlPrtSc   114
  261. #define  ShiftTab     15
  262.  
  263.  
  264. #define  F1           59
  265. #define  ShiftF1      84
  266. #define  CtrlF1       94
  267. #define  AltF1       104
  268.  
  269. #define  F2           60
  270. #define  ShiftF2      85
  271. #define  CtrlF2       95
  272. #define  AltF2       105
  273.  
  274. #define  F3           61
  275. #define  ShiftF3      86
  276. #define  CtrlF3       96
  277. #define  AltF3       106
  278.  
  279. #define  F4           62
  280. #define  ShiftF4      87
  281. #define  CtrlF4       97
  282. #define  AltF4       107
  283.  
  284. #define  F5           63
  285. #define  ShiftF5      88
  286. #define  CtrlF5       98
  287. #define  AltF5       108
  288.  
  289. #define  F6           64
  290. #define  ShiftF6      89
  291. #define  CtrlF6       99
  292. #define  AltF6       109
  293.  
  294. #define  F7           65
  295. #define  ShiftF7      90
  296. #define  CtrlF7      100
  297. #define  AltF7       110
  298.  
  299. #define  F8           66
  300. #define  ShiftF8      91
  301. #define  CtrlF8      101
  302. #define  AltF8       111
  303.  
  304. #define  F9           67
  305. #define  ShiftF9      92
  306. #define  CtrlF9      102
  307. #define  AltF9       112
  308.  
  309. #define  F10          68
  310. #define  ShiftF10     93
  311. #define  CtrlF10     103
  312. #define  AltF10      113
  313.  
  314. //  Some BIOS' don't return these.
  315.  
  316. #define  F11         133
  317. #define  ShiftF11    135
  318. #define  CtrlF11     137
  319. #define  AltF11      139
  320.  
  321. #define  F12         134
  322. #define  ShiftF12    136
  323. #define  CtrlF12     138
  324. #define  AltF12      140
  325.  
  326.  
  327. //  Non special - standard character codes.
  328.  
  329. #define  ESC          27
  330. #define  CR           13
  331. #define  TAB           9
  332. #define  BACKSP        8
  333. #define  SPACE        32
  334. #define  DelCh       127
  335.  
  336.  
  337. #endif
  338.